#include "PlayFab<%- api.name %>DataModels.h"

using namespace PlayFab;
using namespace PlayFab::<%- api.name %>Models;
using namespace rapidjson;

<% for(var i in datatypes) { var datatype = datatypes[i]; if (datatype.isenum) { %>void PlayFab::<%- api.name %>Models::write<%- datatype.name %>EnumJSON(<%- datatype.name %> enumVal, PFStringJsonWriter& writer)
{
    switch (enumVal)
    {
<% for(var i=0; i<datatype.enumvalues.length; i++) { var enumval = datatype.enumvalues[i] %>    case <%- datatype.name %><%- enumval.name %>: writer.String("<%- enumval.name %>"); break;
<% } %>
    }
}

<%- datatype.name %> PlayFab::<%- api.name %>Models::read<%- datatype.name %>FromValue(const rapidjson::Value& obj)
{
    static std::map<std::string, <%- datatype.name %>> _<%- datatype.name %>Map;
    if (_<%- datatype.name %>Map.size() == 0)
    {
        // Auto-generate the map on the first use
<% for(var i=0; i<datatype.enumvalues.length; i++) { var enumval = datatype.enumvalues[i] %>        _<%- datatype.name %>Map["<%- datatype.enumvalues[i].name %>"] = <%- datatype.name %><%- datatype.enumvalues[i].name %>;
<% } %>
    }

    auto output = _<%- datatype.name %>Map.find(obj.GetString());
    if (output != _<%- datatype.name %>Map.end())
        return output->second;

    return <%- datatype.name %><%- datatype.enumvalues[0].name %>; // Basically critical fail
}
<% } else { %>
<%- datatype.name %>::~<%- datatype.name %>()
{
<% for(var p in datatype.properties) { var property = datatype.properties[p]; if (!property.collection && property.isclass && property.optional) { %>    if (<%- getPropertySafeName(property) %> != NULL) delete <%- getPropertySafeName(property) %>;
<% } } %>
}

void <%- datatype.name %>::writeJSON(PFStringJsonWriter& writer)
{
    writer.StartObject();
<% for(var p in datatype.properties) { var property = datatype.properties[p];
%><%- getPropertySerializer("    ", property, datatype) %><% }
%>    writer.EndObject();
}

bool <%- datatype.name %>::readFromValue(const rapidjson::Value& obj)
{
<% for(var p in datatype.properties) { var property = datatype.properties[p];
%><%- getPropertyDeserializer("    ", property, datatype) %><% }
%>
    return true;
}
<% } } %>
